package net.servir.capacidades.web.controller;

import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.MantenimientoService;
import net.servir.capacidades.model.Censo;
import net.servir.capacidades.model.Estudios;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.LogAuditoria;
import net.servir.capacidades.model.MayorGradoAcademico;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.ServicioCivil;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.Snip;
import net.servir.capacidades.model.TipoDocumento;
import net.servir.capacidades.model.TipoObservacion;
import net.servir.capacidades.model.Usuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class ParticipanteEdicionController {

	@Autowired
	private CapacidadesService capacidadesService ;
	
	@Autowired
	private MantenimientoService mantenimientoService ;
	
	@RequestMapping("/participanteEdicion.htm")
	public @ModelAttribute("participanteEdicion")
	ServicioCivil servicioCivil(HttpServletRequest request,HttpServletResponse response) throws Exception {
		ServicioCivil obj = new ServicioCivil();
		
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniResponsable = null;
		if(session.getAttribute("dni") != null)			
			dniResponsable = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del responsable
		Usuario usuario = null;
		if(session.getAttribute("usuario") != null)			
			usuario = (Usuario)session.getAttribute("usuario");
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				

		//************************************************************
		Censo censo = new Censo();
		censo.setCod_session(cod_session);
		session.setAttribute("finalizar", "0");
		
		
		String mensaje="";
		String codRegimen ="";
		String codProfesion ="";
		Number idServicioCivil= 0;
		Number idAmbito=0;
		Number idEjecutora=0;
		String nombres="";		
		String apellidoPaterno="";
		String apellidoMaterno="";
		String codTipoDoc="";
		String dni="";
		String sexo="";
		String fecNacimiento="";
		String telefono="";
		String correo="";		
		String accion="";
		//String formEdicion="";
		String tipoEdicion="";
		String codEstado="";
		String jefe="";
		Number idPuestoTipo = null;
		Integer plazo = 0;
		String detalleObservacion = "";
		String detalleSubsanacion = "";
		String codTipoObservacion = "";
		String estadoObservacion = "";
		String estadoSubsanacion = "";
		
		//Se agregan los nuevos campos  - JM  - 
		String correo_alterno = "";
		LinkedList<MayorGradoAcademico> mayorGradoAcademico;
		String cod_grado_academico="";  
		LinkedList<Snip> obtenerSnip;                       
		String cod_experiencia_snip;  
		LinkedList<Estudios> estudios;                      
		String cod_estudios;      
		String titulo_universitario;  
		String aplicaFuncionPersonalizada;
		
		//************************************************************
		//Obtenemos los parametros generales
		//************************************************************
		if (request.getParameter("idServicioCivil") != null &&
				!request.getParameter("idServicioCivil").toString().equals(""))
			idServicioCivil  = Integer.parseInt(request.getParameter("idServicioCivil"));
		
		if (request.getParameter("idAmbito") != null &&
				!request.getParameter("idAmbito").toString().equals(""))
			idAmbito  = Integer.parseInt(request.getParameter("idAmbito"));

		if (request.getParameter("idEjecutora") != null &&
				!request.getParameter("idEjecutora").toString().equals(""))
			idEjecutora  = Integer.parseInt(request.getParameter("idEjecutora"));

		if (request.getParameter("accion") != null &&
				!request.getParameter("accion").toString().equals(""))
			accion  = request.getParameter("accion").toString();

		if (request.getParameter("tipo_edicion") != null &&
				!request.getParameter("tipo_edicion").toString().equals(""))
			tipoEdicion  = request.getParameter("tipo_edicion").toString();


		if (request.getParameter("estadoSubsanacion") != null &&
				!request.getParameter("estadoSubsanacion").toString().equals(""))
			estadoSubsanacion = request.getParameter("estadoSubsanacion").toString();


		
		
		if (idServicioCivil.intValue() > 0)
		{			
			obj = capacidadesService.ObtenerServicioCivil(idServicioCivil);
			obj.setTipo_edicion("EDIT");
			idEjecutora = obj.getId_ejecutora();
			obj.setId_ejecutora(idEjecutora);
			idAmbito = obj.getId_ambito();
			obj.setId_ambito(idAmbito);
			//obj.setForm_edicion(formEdicion);
			List<PuestoTipo> optPuestoTipo = mantenimientoService.getPuestoTipos(obj.getId_sistema());
			obj.setOptPuestoTipo(optPuestoTipo);		
			
		}
		else
		{
			obj.setTipo_edicion("NEW");
			obj.setId_ejecutora(idEjecutora);
			obj.setId_ambito(idAmbito);
			obj.setCod_estado("INIC");
			//obj.setForm_edicion(formEdicion);
		}	
		
		//************************************************************
		// Log auditoria
		LinkedList<LogAuditoria> logAuditoria = capacidadesService.ObtenerLogAuditoria(obj.getDni());
		obj.setLogAuditoria(logAuditoria);
		
		//************************************************************
		
		LinkedList<Regimen> regimenes = capacidadesService.ObtenerRegimen();
		LinkedList<TipoObservacion> tipoObservaciones = capacidadesService.ObtenerTipoObservacion();
		LinkedList<Profesion> profesiones = capacidadesService.ObtenerProfesion();
		LinkedList<TipoDocumento> documentos = capacidadesService.ObtenerTipoDocumento();
		//LinkedList<ResponsableIdentificacion> responsableIdentificacion =  capacidadesService.ObtenerResponsableIdentificacion(dniResponsable);
		List funciones = capacidadesService.ObtenerFunciones(idServicioCivil);
		//Se llenan los campos nuevos: JM 
		mayorGradoAcademico = capacidadesService.ObtenerMayorGradoAcademico();                       
		obtenerSnip = capacidadesService.ObtenerSnip();   
		estudios = capacidadesService.ObtenerEstudios(); 
		
		//Obtenemos los datos del responsable
		// ResponsableIdentificacion responsable = capacidadesService.GetResponsableIdentificacion(dniResponsable);
		// 
		
		List<Number> idFuncionesParticipante = capacidadesService.ObtenerIdFuncionesSC(idServicioCivil);
		List<Etapa> etapas = capacidadesService.getEtapasNivelGobierno(idEjecutora,plazo);
		
		// obj.setTipoObservaciones(tipoObservaciones);
		obj.setRegimenes(regimenes);
		obj.setProfesiones(profesiones);
		obj.setTipoDocumentos(documentos);
		//obj.setResponsable(responsable);
		//obj.setResponsableIdentificacion(responsableIdentificacion);
		obj.setEtapas(etapas);
		obj.setId_funciones_participante(idFuncionesParticipante);
		//Se llenan los campos nuevos: JM 
		obj.setMayorGradoAcademico(mayorGradoAcademico);
		obj.setObtenerSnip(obtenerSnip);
		obj.setEstudios(estudios);
		
		LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService.ObtenerSistemaEtapa((Number)idAmbito);
		obj.setSistemaEtapa(listaSistemaEtapa);
		
				
		for (Etapa etapa : etapas) {
			for (FuncionLeyenda funcion : etapa.getFunciones()) {
				for (Number id_fun_sel : idFuncionesParticipante) {
					if (funcion.getId_funcion().intValue() == id_fun_sel.intValue())
					{
						funcion.setChecked(1);
					}
				}
			}
		}						
		//request.setAttribute("DATALIST", funciones);		
		
		nombres = request.getParameter("tnombre");
		if(nombres != null)
			nombres= nombres.toUpperCase();
			
		apellidoPaterno = request.getParameter("tapellido_paterno");
		if(apellidoPaterno != null)
			apellidoPaterno= apellidoPaterno.toUpperCase();
		
		apellidoMaterno = request.getParameter("tapellido_materno");		
		if(apellidoMaterno != null)
			apellidoMaterno= apellidoMaterno.toUpperCase();

		dni = request.getParameter("tdni");		
		fecNacimiento = request.getParameter("tfec_nacimiento");		
		telefono = request.getParameter("ttelefono");
		correo= request.getParameter("tcorreo");
		//Se agregan los nuevos campos - JM -
		correo_alterno = request.getParameter("tcorreoAlterno");
		cod_grado_academico=request.getParameter("lgradoacademico");   
		cod_experiencia_snip = request.getParameter("lanioexperienciasnip");  
		cod_estudios = request.getParameter("lestudios");  
		titulo_universitario=request.getParameter("ctitulouniversitario");  
		sexo = request.getParameter("csexo");
		jefe = request.getParameter("cjefe");
		if (request.getParameter("id_puesto_tipo")!= null && !request.getParameter("id_puesto_tipo").equals("0"))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo"));
		
		
		codEstado = request.getParameter("cod_estado");
		if (request.getParameter("lregimen") != null && !request.getParameter("lregimen").trim().equals(""))
			codRegimen = request.getParameter("lregimen");
		if (request.getParameter("lprofesion") != null && !request.getParameter("lprofesion").trim().equals(""))
			codProfesion = request.getParameter("lprofesion");		
		if (request.getParameter("lcod_tipo_doc") != null && !request.getParameter("lcod_tipo_doc").trim().equals(""))
			codTipoDoc = request.getParameter("lcod_tipo_doc");			
		if (request.getParameter("detalleSubsanacion") != null && !request.getParameter("detalleSubsanacion").trim().equals(""))
			detalleSubsanacion = request.getParameter("detalleSubsanacion").toUpperCase();
		
		if ( accion != null && !accion.equals("") )			
		{
			//Actualizamos el objeto con los valores del formulario
			obj.setCorreo(correo.trim().toUpperCase());
			//Se agregan los nuevos campos - JM -
			obj.setCorreo_alterno(correo_alterno.trim().toUpperCase());
			obj.setCod_grado_academico(cod_grado_academico);
			obj.setCod_experiencia_snip(cod_experiencia_snip);
			obj.setCod_estudios(cod_estudios);
			obj.setTitulo_universitario(titulo_universitario);
			String listaFunciones = "";
			listaFunciones = request.getParameter("tlistfuncion");
			if (idPuestoTipo != null)
				obj.setId_puesto_tipo(idPuestoTipo.intValue());
			
			
			if (accion.equals("GRABAR")) {
				
				//Validamos los datos
				if (tipoEdicion.equals("EDIT")) {
					capacidadesService.EditarCorreo(obj);
					idFuncionesParticipante = capacidadesService.ObtenerIdFuncionesSC(idServicioCivil);
					etapas = capacidadesService.getEtapasNivelGobierno(idEjecutora,plazo);
					obj.setEtapas(etapas);
					obj.setId_funciones_participante(idFuncionesParticipante);
					for (Etapa etapa : etapas) {
						for (FuncionLeyenda funcion : etapa.getFunciones()) {
							for (Number id_fun_sel : idFuncionesParticipante) {
								if (funcion.getId_funcion().intValue() == id_fun_sel.intValue())
								{
									funcion.setChecked(1);
								}
							}
						}
					}		
					
					mensaje = "La dirección de correo electrónico fue actualiza correctamente.";
				}
				if (tipoEdicion.equals("REENVIACORREO")) 
				{
					mensaje = capacidadesService.recuperarClave(dni, 2);
					String[] resultados = mensaje.split("&");
					mensaje = resultados[1];				}
			}
		}		
		Integer idPerfil = 2;
		if (session.getAttribute("perfil") !=  null)
			idPerfil = (Integer) session.getAttribute("perfil");
		obj.setIdPerfil(idPerfil);
		obj.setMensaje(mensaje);
		return obj;
	}
}
